﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.IO;

namespace Synchros
{
    public class SyncLine
    {
        private string strSyncLineSfp;

        private DataTable dtTimeSlot;


        // 构造方法
        public SyncLine(string strSyncLineSfp)
        {
            this.strSyncLineSfp = strSyncLineSfp;
            dtTimeSlot = new DataTable("SyncLine");
            {
                dtTimeSlot.Columns.Add("SyncName", typeof(string));

                dtTimeSlot.Columns.Add("Max_LSN", typeof(byte[]));
                dtTimeSlot.Columns.Add("Max_SEQ", typeof(byte[]));

                dtTimeSlot.Columns.Add("Min_LSN", typeof(byte[]));
                dtTimeSlot.Columns.Add("Min_SEQ", typeof(byte[]));
            }
            try
            {
                Load();//加载数据
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        // 加载数据
        private void Load()
        {
            try
            {
                if (File.Exists(this.strSyncLineSfp))
                {
                    // 加载信息
                    dtTimeSlot.ReadXml(this.strSyncLineSfp);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        // 同步时更新LSN
        public void SynLsn(string syncname, byte[] synlsn,byte[] synseq)
        {
            DataRow drTimeSlot = FindTimeSlotDataRow(syncname);

            drTimeSlot["Max_LSN"] = synlsn;
            drTimeSlot["Max_SEQ"] = synseq;
            try
            {
                dtTimeSlot.WriteXml(this.strSyncLineSfp);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        // 清理时更新LSN
        public void ClrLsn(string syncname, byte[] clrlsn,byte[] clrseq)
        {
            DataRow drTimeSlot = FindTimeSlotDataRow(syncname);

            drTimeSlot["Min_LSN"] = clrlsn;
            drTimeSlot["Min_SEQ"] = clrseq;
            try
            {
                dtTimeSlot.WriteXml(this.strSyncLineSfp);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //// 检测该记录是否存在
        //public static bool Exists(string syncname)
        //{
        //    for (int index = 0; index < dtTimeSlot.Rows.Count; index++)
        //    {
        //        if (syncname == dtTimeSlot.Rows[index]["SyncName"].ToString())
        //        {
        //            return true;
        //        }
        //    }
        //    return false;
        //}

        //根据syncname查找对应的行,没有则创建syncname行添加并返回
        private DataRow FindTimeSlotDataRow(string syncname)
        {
            for (int index = 0; index < dtTimeSlot.Rows.Count; index++)
            {
                if (syncname == dtTimeSlot.Rows[index]["SyncName"].ToString())
                {
                    return dtTimeSlot.Rows[index];
                }
            }

            DataRow drTimeSlot = dtTimeSlot.NewRow();

            drTimeSlot["SyncName"] = syncname;

            drTimeSlot["Max_LSN"] = TimeSlot.Empty;
            drTimeSlot["Max_SEQ"] = TimeSlot.Empty;

            drTimeSlot["Min_LSN"] = TimeSlot.Empty;
            drTimeSlot["Min_SEQ"] = TimeSlot.Empty;

            dtTimeSlot.Rows.Add(drTimeSlot);

            return drTimeSlot;
        }

        //把行转换成TimeSlot
        private TimeSlot DataRow_To_TimeSlot(DataRow drTimeSlot)
        {
            TimeSlot timeslot = new TimeSlot();

            timeslot.SyncName = (string)drTimeSlot["SyncName"];

            timeslot.Max_LSN = (byte[])(drTimeSlot["Max_LSN"]);
            timeslot.Max_SEQ = (byte[])(drTimeSlot["Max_SEQ"]);

            timeslot.Min_LSN = (byte[])(drTimeSlot["Min_LSN"]);
            timeslot.Min_SEQ = (byte[])(drTimeSlot["Min_SEQ"]);


            return timeslot;
        }

        // 索引器
        public TimeSlot this[string syncname]
        {
            get
            {
                if (string.IsNullOrEmpty(syncname))
                {
                    throw new Exception("syncname Is Null Or Empty!");
                }
                try
                {
                    return DataRow_To_TimeSlot(FindTimeSlotDataRow(syncname));
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

    }
}

//private SyncItem syncitem;
//private int iSrcDb;
//private int iTable;


//for (int index = 0; index < dtTimeSlot.Rows.Count; index++)
//{
//    if (syncname == dtTimeSlot.Rows[index]["SyncName"].ToString())
//    {
//        LSN timeslot = new LSN();
//        timeslot.SyncName = dtTimeSlot.Rows[index]["SyncName"].ToString();

//        if (dtTimeSlot.Rows[index]["MinTime"] != DBNull.Value)
//        {
//            timeslot.Min_LSN = (byte[])(dtTimeSlot.Rows[index]["Min_LSN"]);
//            timeslot.MinTime = Convert.ToDateTime(dtTimeSlot.Rows[index]["MinTime"]);
//        }
//        timeslot.Max_LSN = (byte[])(dtTimeSlot.Rows[index]["Max_LSN"]);
//        timeslot.MaxTime = Convert.ToDateTime(dtTimeSlot.Rows[index]["MaxTime"]);
//        return timeslot;
//    }
//}

//set
//{
//    if (string.IsNullOrEmpty(syncname))
//    {
//        throw new Exception("syncname Is Null Or Empty!");
//    }
//    for (int index = 0; index < dtTimeSlot.Rows.Count; index++)
//    {
//        if (syncname == dtTimeSlot.Rows[index]["SyncName"].ToString())
//        {
//            LSN timeslot = new LSN();
//            timeslot.SyncName = dtTimeSlot.Rows[index]["SyncName"].ToString();

//            if (dtTimeSlot.Rows[index]["MinTime"] != DBNull.Value)
//            {
//                dtTimeSlot.Rows[index]["Min_LSN"] = timeslot.Min_LSN;
//                dtTimeSlot.Rows[index]["MinTime"] = timeslot.MinTime;
//            }

//            dtTimeSlot.Rows[index]["MaxTime"] = timeslot.MaxTime;
//            dtTimeSlot.Rows[index]["Max_LSN"] = timeslot.Max_LSN;
//            return;
//        }
//    }
//    throw new Exception(string.Format("无效的SyncName:{0}", syncname));
//}


// 测试用
//public TimeSlot this[int index]
//{
//    get
//    {
//        try
//        {
//            return DataRow_To_TimeSlot(dtTimeSlot.Rows[index]);
//        }
//        catch (Exception ex)
//        {
//            throw ex;
//        }
//    }
//}

//////public void Clear(string syncname)
//////{
//////    DataRow drTimeSlot = FindTimeSlotDataRow(syncname);

//////    drTimeSlot["MinTime"] = DBNull.Value;
//////    drTimeSlot["Min_LSN"] = DBNull.Value;

//////    try
//////    {
//////        dtTimeSlot.WriteXml(this.strSyncLineSfp);
//////    }
//////    catch (Exception ex)
//////    {
//////        throw ex;
//////    }
//////}


//public SyncLine(SyncItem syncitem, int iSrcDb, int iTable)
//{
//    this.strSyncLineSfp = SqlHelper.GetSyncLineSfp(syncitem, iSrcDb, iTable);

//    dtTimeSlot = new DataTable(SqlHelper.GetSyncName(syncitem, iSrcDb, iTable));
//    {
//        dtTimeSlot.Columns.Add("SyncName", typeof(string));

//        dtTimeSlot.Columns.Add("Min_LSN", typeof(byte[]));
//        dtTimeSlot.Columns.Add("MinTime", typeof(DateTime));

//        dtTimeSlot.Columns.Add("Max_LSN", typeof(byte[]));
//        dtTimeSlot.Columns.Add("MaxTime", typeof(DateTime));
//    }
//    try
//    {
//        Load();//加载数据
//    }
//    catch (Exception ex)
//    {
//        throw ex;
//    }
//}

//// 保存数据
//public void Save(TimeSlot timeslot)//string strSyncLineSfp
//{
//    DataRow drTimeSlot = FindTimeSlotDataRow(timeslot.SyncName);

//    drTimeSlot["SyncName"] = timeslot.SyncName;

//    if (timeslot.MinTime.HasValue)
//    {
//        drTimeSlot["MinTime"] = timeslot.MinTime;
//        drTimeSlot["Min_LSN"] = timeslot.Min_LSN;
//    }
//    drTimeSlot["Max_LSN"] = timeslot.Max_LSN;
//    drTimeSlot["MaxTime"] = timeslot.MaxTime;

//    try
//    {
//        dtTimeSlot.WriteXml(this.strSyncLineSfp);
//    }
//    catch (Exception ex)
//    {
//        throw ex;
//    }
//}